const { getRoleInfo } = require('../service/role.service')
const {
    formateError,
    noMenuSelectedError,
    roleCodeAlreadyExisted,
    insufficientPermissionsError
} = require('../constant/err.type')

/**
 * 判断新建角色数据完整性
 */
async function roleAddValidator (ctx, next) {
    const { roleName, roleCode, menu } = ctx.request.body
    if (!roleName || !roleCode) {
        console.error('缺少角色名和角色编码', ctx.request.body)
        ctx.app.emit('error', formateError, ctx)
        return
    }
    if (!menu) {
        console.error('未选择菜单，至少选择一个菜单项', ctx.request.body)
        ctx.app.emit('error', noMenuSelectedError, ctx)
        return
    }
    await next()
}

/**
 * 判断修改角色数据完整性
 */
async function roleModifyValidator (ctx, next) {
    const { roleName, roleCode, roleDesc } = ctx.request.body
    if (!roleName || !roleCode) {
        console.error('缺少角色名和角色编码', ctx.request.body)
        ctx.app.emit('error', formateError, ctx)
        return
    }
    await next()
}

/**
 * 判断是否选择至少一个菜单项
 */
async function menuIsExist (ctx, next) {
    const { menu } = ctx.request.body
    if (!menu) {
        console.error('未选择菜单，至少选择一个菜单项', ctx.request.body)
        ctx.app.emit('error', noMenuSelectedError, ctx)
        return
    }
    await next()
}


/**
 * 判断角色编码是否存在
 */
async function roleCodeIsExist (ctx, next) {
    const { roleCode } = Object.keys(ctx.query).length !== 0 ? ctx.query : ctx.request.body
    if (!roleCode) {
        console.error('缺少角色编码', ctx.request.body)
        ctx.app.emit('error', formateError, ctx)
        return
    }
    await next()
}

/**
 * 判断数据唯一性
 */
async function verifyCodeOnly (ctx, next) {
    const { roleCode } = ctx.request.body
    // 判断修改的角色是否存在
    const res = await getRoleInfo({ role_code: roleCode })
    if (res.length !== 0) {
        console.error('该角色编码已被使用', ctx.request.body)
        ctx.app.emit('error', roleCodeAlreadyExisted, ctx)
        return
    }
    await next()
}

/**
 * 判断操作用户是否为管理员身份
 */
async function verifyAdminRole (ctx, next) {
    const { role } = ctx.state.token
    if (role !== 'admin' && role !== 'super_admin') {
        console.error('操作用户非管理员身份，权限不足', ctx.request.body)
        ctx.app.emit('error', insufficientPermissionsError, ctx)
        return
    }
    await next()
}

module.exports = {
    roleAddValidator,
    verifyCodeOnly,
    roleCodeIsExist,
    verifyAdminRole,
    roleModifyValidator,
    menuIsExist
}